package com.itzhoun;

/**
 * @author 周楠
 * @Date 2023/01/28/下午 12:32
 */
public class ObserverTest {

    /**
     *定义： 定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
     *
     * 优点： 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
     *
     * 缺点： 1、如果一个被观察者对象有很多的直接和间接的观察者的话，将所有的观察者都通知到会花费很多时间。
     * 2、如果在观察者和观察目标之间有循环依赖的话，观察目标会触发它们之间进行循环调用，可能导致系统崩溃。
     * 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的，而仅仅只是知道观察目标发生了变化。

     * 抽象被观察者角色：也就是一个抽象主题，它把所有对观察者对象的引用保存在一个集合中，每个主题都可以有任意数量的观察者。抽象主题提供一个接口，可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
     *
     * 抽象观察者角色：为所有的具体观察者定义一个接口，在得到主题通知时更新自己。
     *
     * 具体被观察者角色：也就是一个具体的主题，在集体主题的内部状态改变时，所有登记过的观察者发出通知。
     *
     * 具体观察者角色：实现抽象观察者角色所需要的更新接口，一边使本身的状态与制图的状态相协调。
     *
     * @param args
     */



    public static void main(String[] args) {

        WeChatServer weChatServer = new WeChatServer();

        User zhangSan = new User("ZhangSan");

        User lisi = new User("Lisi");

        User wangwu = new User("Wangwu");

        weChatServer.registerObserver(zhangSan);
        weChatServer.registerObserver(lisi);
        weChatServer.registerObserver(wangwu);

        weChatServer.inform("周楠是大帅哥");

        System.out.println("王五取消了关注======================");
        weChatServer.removeObserver(wangwu);
        weChatServer.inform("刘念是大美女");

    }
}
